#include <stdio.h>
#include <stdarg.h>

/*  register int counter asm("eax");
    stdout: 终端 ... / stdin:键盘, 文件写入 ... 
    unix上标准输入输出会先把字符装缓存区, 当条件触发时才会送入设备
        触发条件:
            等到缓冲区累积到一定长度 自动刷新
            \n 或 fflush(stdout)/fflush(stdin) 立即刷新
            程序以exit结束
            setvbuf(stdout,NULL,_IONBF,0); 禁止缓冲区 *最好不用
    这样做的目的可以减少设备io, 例如:
        需要打印 "abcde" 如果没有缓冲区,终端经历5次io, "abcde\n" 只有1次io 

        printf("aaaaaa: %.7g\n", left->value->f_number4->f);
                    printf("bbbbbb: %.16g\n", right->value->f_number8->f);
    
    // fflush(stdout);
    // printf("aaaaaa");
    // fflush(stdout);
*/
char *out(const char * str, ...){

    va_list ap;
    va_start(ap, str);
    int i=0;
    while (str[i] != '\0')
    {
		/* 普通字符正常打印 */
		if (str[i] != '%')
		{
            if (str[i] == '\\' && str[i+1] == 'n') //换行
            {
                putchar(10);
                i +=2;
            }else{
    	        putchar(str[i++]);
            }
			continue;
		}
        
		switch (str[++i])
		{
			case 's': printf("%s", va_arg(ap, char *));
			  		  break; 
		    case 'd': printf("%.16g", va_arg(ap, double));  
			  		  break;
		    case 'f': printf("%.7g", va_arg(ap, double));
			  		  break;
		    case 'n': {
                if(str[++i] == '8'){
                    printf("%lld", va_arg(ap, long long));
                }
                else{
                    printf("%d", va_arg(ap, int));
                }
                break;
            }
			default : break;
		}

		i++; // 下一个字符
    }
    va_end(ap);
    fflush(stdout);
}
void outF(float a, double b){
    printf("float a:%.7g double b:%.16g", a, b);
}